package main

import "fmt"

func main()  {
	/*
	函数作为返回值：
	 */
	 res1 := fun9 // 函数类型：func(int, int) int
	 res2 := fun9(1, 5) // 整型：int
	 fmt.Println(res1(10, 20)) //res1作为参数类型，可以被调用执行
	 fmt.Println(res2) //res2作为int类型，可以被直接打印输出
	 res3:=fun10(10, 20) //func() int
	 fmt.Printf("%T\n",res3)
	res4 := res3()
	fmt.Println(res4) // 30

	fmt.Println("---------------")
	/*
	全局变量和局部变量：
	局部变量：函数内部定义的变量，包括参数。
		随着函数的调用而创建，随着函数的结束而销毁。
		闭包：
	 */
	res5 := increment() // res5 = fun
	fmt.Println(res5) //
	fmt.Println(res5())// 1
	fmt.Println(res5())// 2
	fmt.Println(res5())// 3
	fmt.Println(res5())// 4

	res6:=increment() //
	fmt.Println(res6())//1
	fmt.Println(res6())//2

	fmt.Println(res5()) // 5
	res7:=increment()
	fmt.Println(res7())//1

	res5 = increment()//?
	fmt.Println(res5())//
	fmt.Println(res5,res6,res7)
}
func increment() func()int{ //外层函数
	x := 0 // 局部变量
	fun:= func() int { // 匿名函数：里层函数
		x++
		return x
	}
	fmt.Println(fun)
	return fun // return里层函数
}
func fun9(a, b int) int  {
	return a + b
}
//func test1(m int, n int, fun  func(int, int) int) int{
func fun10(a, b int) func() int  { // 将一个函数作为返回值了。
	//fun:=func ()int{
	//	return a + b
	//}
	//return fun
	return func() int {
		return a + b
	}
}





